package com.qf.service.Impl;

import com.qf.entity.AttendanceRecordsDTO;
import com.qf.entity.AttendanceRecordsVO;
import com.qf.exception.MyException;
import com.qf.mapper.AttendanceRecordsMapper;
import com.qf.service.AttendanceRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;

/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName AttendanceRecordsServiceImpl
 * @Date: 2025/5/23 上午11:10
 * @Description: 描述
 */
@Service
public class AttendanceRecordsServiceImpl implements AttendanceRecordsService {

    @Autowired
    private AttendanceRecordsMapper attendanceRecordsMapper;

    @Override
    public List<AttendanceRecordsVO> findAll(AttendanceRecordsDTO attendanceRecordsDTO) {
        return attendanceRecordsMapper.findAll(attendanceRecordsDTO);
    }

    @Override
    public AttendanceRecordsVO getAttendanceStats() {
        return attendanceRecordsMapper.getAttendanceStats();
    }

    @Override
    public Boolean checkIn(AttendanceRecordsDTO attendanceRecordsDTO) {
        // todo：处理一些业务逻辑，比如：判断用户是否已经签到，签到成功返回true，签到失败返回false
        // 1. 校验是否已签到
        Boolean hasCheckedIn = attendanceRecordsMapper.hasCheckedIn(attendanceRecordsDTO);
        if (hasCheckedIn != null && hasCheckedIn) {
            throw new MyException(400, "今日已签到，请勿重复操作");
        }

        // 需要将 Date 类型转换为 LocalTime 才能进行时间的比较操作
        LocalTime checkInTime =
                attendanceRecordsDTO.getAttendanceDate().toInstant()
                        .atZone(ZoneId.systemDefault())
                        .toLocalTime();

        // 2. 获取当前签到时间，并与标准时间比较，设置 status 状态
        LocalTime onTime = LocalTime.of(9, 0);  // 上班时间 09:00
        LocalTime lateTime = LocalTime.of(9, 30); // 迟到截止时间 09:30
        LocalTime absentTime = LocalTime.of(10, 0); // 旷工截止时间 10:00

        int status;
        if (checkInTime.isBefore(onTime)) {
            status = 3; // 早退（提前打卡？可能是异常）
        } else if (!checkInTime.isAfter(onTime) && !checkInTime.isAfter(lateTime)) {
            status = 1; // 正常
        } else if (!checkInTime.isAfter(lateTime) && !checkInTime.isAfter(absentTime)) {
            status = 2; // 迟到
        } else {
            status = 4; // 旷工
        }

        // 设置上班打卡时间并设置到DTO中
        attendanceRecordsDTO.setMorningCheckInTime(new Date());

        // 将状态设置进 DTO
        attendanceRecordsDTO.setStatus(status);

        // 设置记录的时间
        attendanceRecordsDTO.setCreatedAt(new Date());

        // 3. 执行签到操作
        return attendanceRecordsMapper.checkIn(attendanceRecordsDTO);
    }

    @Override
    public Boolean checkOut(AttendanceRecordsDTO attendanceRecordsDTO) {
        // 1. 判断是否已签到（没有上班记录不允许下班）
        Boolean hasCheckedIn = attendanceRecordsMapper.hasCheckedInSuccessfully(attendanceRecordsDTO);
        if (hasCheckedIn == null || !hasCheckedIn) {
            throw new MyException(400, "你还没有签到，请先签到");
        }

        // 判断是否已经签到下班
        Boolean hasCheckedOut = attendanceRecordsMapper.hasCheckedOut(attendanceRecordsDTO);
        if (hasCheckedOut != null && hasCheckedOut) {
            throw new MyException(400, "今日已签出，请勿重复操作");
        }

        // 2. 获取当前打卡时间（LocalTime）
        LocalTime checkOutTime = attendanceRecordsDTO.getAttendanceDate().toInstant()
                .atZone(ZoneId.systemDefault()).toLocalTime();

        // 假设下班时间为 18:00
        LocalTime offWorkTime = LocalTime.of(18, 0);

        // 3. 判断是否早退
        if (checkOutTime.isBefore(offWorkTime)) {
            attendanceRecordsDTO.setStatus(3); // 状态为早退
        } else {
            attendanceRecordsDTO.setStatus(1); // 正常下班
        }

        // 设置下班打卡时间
        attendanceRecordsDTO.setAfternoonCheckOutTime(new Date());

        // 4. 执行下班打卡操作（更新下班时间及状态）
        return attendanceRecordsMapper.checkOut(attendanceRecordsDTO);
    }



}
